from common.enum.stock_category_enum import StockCategoryEnum
from service.das.stock_monitor_das import AntMonitorStock, StockDas
from views.template_page_view import TableDataDto


class StockViewService:

    def query_stocks_by_category_and_sort(self, category, sort_by="focus_level"):
        """
        查询股票，按分类过滤并根据指定字段排序。
        :param category: 要查询的股票分类（例如 StockCategoryEnum.UNIQUE）。
        :param sort_by: 排序字段，"focus_level" 或 "risk_level"。
        :return: 查询结果列表。
        """
        stock_das = StockDas()

        # 校验排序字段是否有效
        if sort_by not in ["focus_level", "risk_level"]:
            raise ValueError(
                "Invalid sort_by value. Use 'focus_level' or 'risk_level'."
            )

        # 查询并排序
        query = (
            stock_das.select()
            .where(AntMonitorStock.stock_category == category.value[0])
            .order_by(getattr(AntMonitorStock, f"stock_{sort_by}").desc())
        )

        return list(query)

    def get_stock_table_info(
        self, category: StockCategoryEnum, sort_by: str
    ) -> TableDataDto:
        """
        根据分类和排序方式查询股票数据，并返回格式化的报表数据。
        :param category: 股票分类枚举值（例如 StockCategoryEnum.UNIQUE）
        :param sort_by: 排序字段，"focus_level" 或 "risk_level"
        :return: TableDataDto 对象
        """
        AntLogger.info(f"get_stock_table_info: 分类={category}, 排序方式={sort_by}")

        # 查询股票数据
        stock_list = self.query_stocks_by_category_and_sort(category, sort_by)

        # 格式化股票数据为表格形式
        table_data = []
        for stock in stock_list:
            stock_code = stock.stock_code
            stock_name = stock.stock_name
            stock_current_price = (
                f"{stock.monitor_current_price:.2f}"
                if stock.monitor_current_price is not None
                else "N/A"
            )
            monitor_income_ratio = (
                f"{stock.monitor_income_ratio:.2f}%"
                if stock.monitor_income_ratio is not None
                else "N/A"
            )
            stock_risk_level = self.get_risk_level_description(stock.stock_risk_level)

            table_data.append(
                [
                    stock_code,
                    stock_name,
                    stock_current_price,
                    monitor_income_ratio,
                    stock_risk_level,
                    stock_focus_level,
                ]
            )

        # 返回表格数据
        return TableDataDto(
            table_header=[
                "股票代码",
                "股票名称",
                "股票当前价",
                "当前盈亏比例",
                "当前风险等级",
                "当前关注等级",
            ],
            table_data=table_data,
            table_item_fun=[{"查看详情": self.show_table_detail}],
        )

    def get_risk_level_description(self, risk_level: int) -> str:
        """
        根据风险等级返回描述。
        :param risk_level: 风险等级
        :return: 风险等级描述
        """
        if risk_level is None:
            return "未知"
        return f"风险等级 {risk_level}"

    def show_table_detail(self, stock_code: str):
        """
        查看股票详情（示例方法，具体逻辑可实现）。
        :param stock_code: 股票代码
        """
        AntLogger.info(f"查看股票详情: {stock_code}")
